package com.zyy.java8.samples.lambda;

/**
 * @author zhangyiying
 * @ClassName: Interface1
 * @Description: 在接口中可以使用default和static关键字来修饰接口中定义的普通方法
 *                 在JDK1.8中很多接口会新增方法，为了保证1.8向下兼容，1.7版本中的接口实现类不用每个都重新实现新添加的接口方法，
 *                 引入了default默认实现，static的用法是直接用接口名去调方法即可。
 *                 当一个类继承父类又实现接口时，若后两者方法名相同，则优先继承父类中的同名方法，即“类优先”，
 *                 如果实现两个同名方法的接口，则要求实现类必须手动声明默认实现哪个接口中的方法。
 * @date 2021/12/23 9:54
 */
public class Interface1 {

    interface Formula {

        double calculate(int a);

        default double sqrt(int a){
            return Math.sqrt(positive(a));
        }

        static int positive(int a){
            return a > 0 ? a : 0;
        }
    }

    public static void main(String[] args) {
        Formula formula1 = new Formula() {
            @Override
            public double calculate(int a) {
                return sqrt(a * 100);
            }
        };


        //100.0
        System.out.println(formula1.calculate(100));
        //0.0
        System.out.println(formula1.sqrt(-23));
        //0.0
        System.out.println(Formula.positive(-4));

    }
}
